/*
面向对象的三大特性：封装 、继承、多态

Dart中的类的继承：  
  1、子类使用extends关键词来继承父类
  2、子类会继承父类里面可见的属性和方法 但是不会继承构造函数
  3、子类能复写父类的方法 getter和setter
*/

class Person {
  String name = 'ts';
  num age = 18;
  void printInfo() {
    print("${this.name}---${this.age}");
  }
}

class Person2 {
  String name;
  int age;
  Person2(this.name, this.age);
  void printInfo() {
    print("${this.name}---${this.age}");
  }

  work() {
    print('${this.name}在工作');
  }
}

// 通过extends关键字 继承父类

// 1. 普通继承
class Web extends Person {}

// 2. super关键字给父类传参
class Web2 extends Person2 {
  late String sex;
  // 2.1 super使用方式1
  Web2(super.name, super.age, this.sex);
  // 2.2 super使用方式2
  // Web2(String name, int age, String sex) : super(name, age) {
  //   this.sex = sex;
  // }

  // 2.3 子类还可以通过super关键直接调用父类的方法
  void run() {
    print('${this.name}-${this.age}-${this.sex}');
    super.work();
  }

  // 3. 覆写父类的方法
  //覆写父类的方法
  @override //可以写也可以不写  建议在覆写父类方法的时候加上 @override
  work() {
    print("${this.name}的工作是写代码");
  }
}

main() {
  Web web = new Web();
  web.printInfo();

  Web2 web2 = new Web2('TS', 19, '男');
  web2.printInfo(); // 调用父类的方法
  web2.run();
  web2.work(); // 覆写父类方法
}
